<?php

class OWOX_Functions_TestFunctions extends MinkTestCase
{
    protected function setUp()
    {
        $driver = $this -> getSelenium2Driver();
        $this -> _getSession($driver);
        parent::setUp();


    }

    protected function tearDown()
    {
        parent::tearDown();
        $this -> session -> stop();
    }

    /**
     * Открытие страницы и ресайз.
     * @return void
     */

    public function openPage($url)
    {
        $this -> session -> resizeWindow(1000, 1200);
        $this -> session -> visit($url);
        $this -> session -> wait(1000);
    }



    /**
     * Клик по кнопке.
     * @return void
     */

    public function clickButton($locator)
    {
        $this -> session -> getPage() -> find("xpath", $locator) -> click();
    }

    /**
     * Клик по кнопке и ожидание.
     * @return void
     */

    public function clickButtonAndWait($locator, $time)
    {
        $this -> session -> getPage() -> find("xpath", $locator) -> click();
        $this -> session -> wait($time);
    }

    /**
     * Проверка верной ширины элемента.
     * @return void
     */

    public function checkElementWidth($locator, $width, $message)
    {
        $get_element_width = $this -> session -> getPage() -> find("xpath", $locator) -> getAttribute('offsetWidth');
        $this -> assertEquals($get_element_width, $width, $message);
    }

    /**
     * Проверка верной высоты элемента.
     * @return void
     */

    public function checkElementHeight($locator, $height, $message)
    {
        $get_element_height = $this -> session -> getPage() -> find("xpath", $locator) -> getAttribute('offsetHeight');
        $this -> assertEquals($get_element_height, $height, $message);
    }

    /**
     * Проверка присутствия элемента.
     * @return void
     */

    public function elementHere($locator, $message)
    {
        $element = $this -> session -> getPage() -> find("xpath", $locator);
        $this -> assertNotNull($element , $message);
    }

    /**
     * Проверка отсутствия элемента.
     */

    public function elementNotHere($locator, $message)
    {
        $element  = $this -> session -> getPage() -> find("xpath", $locator);
        $this -> assertNull($element , $message);
    }

    /**
     * Заполнение поля.
     * @return void
     */

    public function fillingField($locator, $text)
    {
        $this -> session -> getPage() -> find("xpath", $locator) -> setvalue($text);
    }

    /**
     * Вывод информации о тесте и адресс.
     * @return void
     */

    public function information($text, $url = null)
    {
       echo "$text $url\n";
    }

    /**
     * Скролл страницы.
     * @return void
     */

    public function scrollPage($horizontal, $vertical)
    {
        $this -> session -> evaluateScript("scroll($horizontal, $vertical);");
    }

    /**
     * Проверка текста в элементе.
     * @return void
     */

    public function textValidation($locator, $expected_value, $message)
    {
        $actual_value = $this -> session -> getPage() -> find("xpath", $locator) -> getText();
        $this -> assertEquals($actual_value, $expected_value, $message);
    }

    /**
     * @param $str
     * @return mixed
     */
    protected function _getNumber($str)
    {

        return intval(preg_replace('/[\D]*/', '', $str));

    }

    /**
     * Проверка текста в элементе.
     * @return void
     */

    public function priceValidation($locator, $sample, $message)
    {
        $discount = $this -> _getNumber($this -> session -> getPage() -> find("xpath", $locator) -> getText());

        $actual_price = intval($this -> session -> getPage() -> find("xpath", $sample) -> getAttribute('price'));

        $this -> assertEquals($discount, round($actual_price * 0.1), $message);
    }

    /**
     * Проверка отсутствия контента в коде страницы.
     * @return void
     */

    public function contentNotHere($url, $unwanted_content, $message)
    {
        $this -> session -> visit($url);
        $where_search = $this -> session -> getPage() -> getContent();
        $what_search = $unwanted_content;
        $find_unwanted_content = strpos($where_search, $what_search);
        $this ->assertEquals($find_unwanted_content, false, $message);
    }

    /**
     * Проверка присутствия контента в коде страницы.
     * @return void
     */

    public function contentHere($url, $wanted_content, $message)
    {
        $this -> session -> visit($url);
        $where_search = $this -> session -> getPage() -> getContent();
        $what_search = $wanted_content;
        $find_wanted_content = strpos($where_search, $what_search);
        $this -> assertNotEquals($find_wanted_content, false, $message);
    }

    /**
     * Залогинится на страницу.
     * @return void
     */

    public function login($email, $password)
    {
        $this -> ClickButton('//*[@id="menu-user"]/a');
        $this -> session -> wait(1000);
        $this -> FillingField('//*[@id="login"]/div/div[2]/div[1]/div[2]/div[2]/input', $email);
        $this -> FillingField('//*[@id="login"]/div/div[2]/div[1]/div[3]/div[2]/input', $password);
        $this -> ClickButtonAndWait('//*[@id="login"]/div/div[2]/div[1]/div[5]/button', 1000);
    }

    /**
     * Почистить куки и перезагрузить страницу.
     * @return void
     */

    public function unLogin()
    {
        $this -> session -> executeScript("document.cookie = 'sid=;domain=.owox.ua;path=/';");
        $this -> session -> executeScript("document.cookie = 'uid=;domain=.owox.ua;path=/';");
        $this -> session -> reload();
    }

    /**
     * Регистрация заданного количества пользователей на owox.ua.
     * @param $url
     * @param $base_value
     * @param $users_number
     * @return array
     */
    public function Registration($url, $count)
    {
        $registered_emails = array();

        for($i = 0; $i < $count; $i++)
        {
            $this -> OpenPage($url);

            $email = $this -> generateEmailOwox();

            $registered_emails[] = $email;

            $this -> FillingField(
                '//*[@id="page"]/div/div/div/section/div/form/table[1]/tbody/tr[1]/td[2]/input', $email);

            $this -> FillingField(
                '//*[@id="page"]/div/div/div/section/div/form/table[1]/tbody/tr[2]/td[2]/input', '123');

            $this -> FillingField(
                '//*[@id="page"]/div/div/div/section/div/form/table[1]/tbody/tr[3]/td[2]/input', 'owox' . $i);

            $this -> FillingField(
                '//*[@id="page"]/div/div/div/section/div/form/table[1]/tbody/tr[5]/td[2]/input', 'tester');

            $this -> ClickButtonAndWait(
                '//*[@id="page"]/div/div/div/section/div/form/table[2]/tbody/tr/td[2]/input', 2500);

            $old_user = $this -> session -> getPage() -> find(
                "xpath", '//*[@id="page"]/div/div/div/section/div/form/div[1]/div');

            if($old_user != null)
            {
                $old_user -> getText();
                $this -> assertEquals($old_user, null,"Пользователь $email уже существует");
            }

            $this -> session -> executeScript("document.cookie = 'sid=;domain=.owox.ua.ll;path=/';");

            $this -> session -> executeScript("document.cookie = 'uid=;domain=.owox.ua.ll;path=/';");

            $this -> session -> reload();
        }

        return $registered_emails;

    }

    public function generateEmailOwox()
    {
        return 'daily_owox_test_' . uniqid() .'_@daily.tt';
    }

    /**
     * Регистрация заданного количества пользователей на GoA!.
     * @param $url
     * @param $base_value
     * @param $users_number
     * @return array
     */

    public function registrationGoa($url, $count)
    {
        $registered_emails = array();

        for($i = 0; $i < $count; $i++)
        {
            $this -> OpenPage($url);

            $email = $this -> generateEmailGoa();

            $registered_emails[] = $email;

            $this -> FillingField(
                '//*[@id="page"]/div/div/form[1]/div/div/article/div[1]/input', 'krass');

            $this -> FillingField(
                '//*[@id="page"]/div/div/form[1]/div/div/article/div[2]/input', 'test');

            $this -> FillingField(
                '//*[@id="page"]/div/div/form[1]/div/div/article/div[3]/input', 'owox');

            $this -> FillingField(
                '//*[@id="page"]/div/div/form[1]/div/div/div[1]/input', $email);

            $this -> FillingField(
                '//*[@id="page"]/div/div/form[1]/div/div/div[2]/input', '123');

            $this -> FillingField(
                '//*[@id="page"]/div/div/form[1]/div/div/div[3]/input', '0987654321');

            $this -> ClickButtonAndWait(
                '//*[@id="page"]/div/div/form[1]/div/div/section/ul/li[2]/h3/label', 500);

            $this -> FillingField(
                '//*[@id="user-fields21"]/div[1]/input', '123');

            $this -> FillingField(
                '//*[@id="user-fields21"]/div[2]/input', '321');

            $this -> ClickButtonAndWait(
                '//*[@id="add-comment-link"]', 2000);

            $this -> FillingField(
                '//*[@id="order-comment-container"]/div/textarea', 'Daily full registration autotest');

            $this -> ClickButtonAndWait(
                '//*[@id="page"]/div/div/form[1]/div/div/section/span/button', 2000);

            $old_user = $this -> session -> getPage() -> find(
                "xpath", '//*[@id="page"]/div/div/div/div[1]/div');

            if($old_user != null)
            {
                $old_user -> getText();
                $this -> assertNotEquals($old_user, null);
            }

            $this -> session -> executeScript("document.cookie = 'sid=;domain=.owox.ua.ll;path=/';");

            $this -> session -> executeScript("document.cookie = 'uid=;domain=.owox.ua.ll;path=/';");

            $this -> session -> reload();
        }

        return $registered_emails;

    }

    public function generateEmailGoa()
    {
        return 'daily_goa_test_' . uniqid() . '_@daily.tt';
    }

    /**
     *
     * @param $url
     * @param $base_value
     * @param $users_number
     * @return array
     */

    public function loginGoa($email, $password)
    {
        $this -> ClickButton('//*[@id="menu-user"]/a');
        $this -> FillingField('//*[@id="login"]/div[2]/div[2]/input', $email);
        $this -> FillingField('//*[@id="login"]/div[3]/div[2]/input', $password);
        $this -> ClickButtonAndWait('//*[@id="login"]/div[5]/div/button', 1000);
    }



    /**
     * Возвращает двойной массив инфы из файла.
     * @return array
     */

    public function ForDataProvider($data)
    {
        $file_sites = file('/owox/engine/master/tests/engine/OWOX/Sites/' . $data);
        foreach ($file_sites as &$value)
        {
            $value = array($value);
        }
        return $file_sites;

    }

    /**
     * Заполнение простой формы
     * @return void
     */

    public function fillSimpleForm($email, $url)
    {
        $this -> session -> wait(1000);
        $this -> ScrollPage(0, 1600);
        $this -> ClickButton('//*[@id="slide-link"]');
        $this -> FillingField('//*[@id="form"]/div[3]/div[2]/input', 'owox_tester');
        $this -> FillingField('//*[@id="form"]/div[4]/div[2]/input', $email);
        $this -> FillingField('//*[@id="form"]/div[5]/div[2]/input', '0994403144');
        $this -> FillingField('//*[@id="form"]/div[6]/div[2]/input', 'owox.ua');
        $this -> FillingField('//*[@id="form"]/div[7]/div[2]/textarea', 'owox_test');
        $this -> ScrollPage(0, 1600);
        $this -> ClickButton('//*[@id="slide-button"]');
        $this -> session -> wait(2000);
        $this -> TextValidation('//*[@id="div_complite"]/p/div',
            'Мы получили ваше сообщение и в ближайшее время обязательно свяжемся с вами',
            "Что-то пошле не так на $url\n");
    }

    /**
     * Заполнение формы mobile
     * @return void
     */

    public function fillMobileForm($email)
    {
        $this -> session -> wait(1000);
        $this -> ScrollPage(0, 1200);
        $this -> ClickButton('//*[@id="slide-link"]');
        $this -> FillingField('//*[@id="form"]/div[3]/div[2]/input', 'owox_tester');
        $this -> FillingField('//*[@id="form"]/div[4]/div[2]/input', $email);
        $this -> FillingField('//*[@id="form"]/div[5]/div[2]/input', '0994403144');
        $this -> FillingField('//*[@id="form"]/div[6]/div[2]/input', 'owox.ua');
        $this -> FillingField('//*[@id="form"]/div[7]/div[2]/input', 'SKU');
        $this -> FillingField('//*[@id="form"]/div[8]/div[2]/input', 'owox_shop');
        $this -> FillingField('//*[@id="form"]/div[9]/div[2]/textarea', 'owox_test');
        $this -> ClickButton('//*[@id="slide-button"]');
        $this -> session -> wait(2000);
        $this -> TextValidation('//*[@id="div_complite"]/p/div',
            'Мы получили ваше сообщение и в ближайшее время обязательно свяжемся с вами',
            "Что-то пошле не так \n");
    }


    /**
     * Заполнение формы kiosk
     * @return void
     */

    public function fillKioskForm($email)
    {
        $this -> session -> wait(1000);
        $this -> ScrollPage(0, 1200);
        $this -> ClickButton('//*[@id="slide-link"]');
        $this -> FillingField('//*[@id="form"]/div[3]/div[2]/input', 'owox_tester');
        $this -> FillingField('//*[@id="form"]/div[4]/div[2]/input', $email);
        $this -> FillingField('//*[@id="form"]/div[5]/div[2]/input', '0994403144');
        $this -> FillingField('//*[@id="form"]/div[6]/div[2]/input', 'owox.ua');
        $this -> FillingField('//*[@id="form"]/div[7]/div[2]/input', '1');
        $this -> FillingField('//*[@id="form"]/div[8]/div[2]/input', 'SKU');
        $this -> FillingField('//*[@id="form"]/div[9]/div[2]/textarea', 'owox_test');
        $this -> ClickButton('//*[@id="slide-button"]');
        $this -> session -> wait(2000);
        $this -> TextValidation('//*[@id="div_complite"]/p/div',
            'Мы получили ваше сообщение и в ближайшее время обязательно свяжемся с вами',
            "Что-то пошле не так \n");
    }

    /**
     * Заполнение формы demo
     * @return void
     */

    public function fillDemoForm($email)
    {
        $this -> session -> wait(1000);
        $this -> ScrollPage(0, 1200);
        $this -> ClickButton('//*[@id="slide-link"]');
        $this -> FillingField('//*[@id="form"]/div[2]/div[2]/input', 'owox_tester');
        $this -> FillingField('//*[@id="form"]/div[3]/div[2]/input', $email);
        $this -> FillingField('//*[@id="form"]/div[4]/div[2]/input', '0994403144');
        $this -> FillingField('//*[@id="form"]/div[5]/div[2]/input', 'owox.ua');
        $this -> FillingField('//*[@id="form"]/div[6]/div[2]/input', 'owox_project');
        $this -> FillingField('//*[@id="form"]/div[7]/div[2]/input', '1');
        $this -> FillingField('//*[@id="form"]/div[8]/div[2]/input', '2');
        $this -> FillingField('//*[@id="form"]/div[9]/div[2]/input', '3');
        $this -> ClickButton('//*[@id="slide-button"]');
        $this -> session -> wait(2000);
        $this -> TextValidation('//*[@id="div_complite"]/p/div',
            'Мы получили ваше сообщение и в ближайшее время обязательно свяжемся с вами',
            "Что-то пошле не так \n");
    }
}